<?php /** 进行表单校验 **/
require_once 'CommonMethods.php';
require_once 'RespJson.php';
class VerifyFormData{
    /** 构造器私有 **/
    private function __construct(){}
    /** 防止克隆 **/
    private function __clone(){}

    /** 对试卷内容的处理
     * @param $form
     * @return bool
     */
    public static function submitPaperDataVerify(&$form): bool{
        /* 进行 submit bool 转换 */
        if( CommonMethods::isEmpty($form['submit']) ){
            RespJson::fail("期望{submit}类型为{bool}");
            return false;
        }
        if( $form['submit'] === 'true' ){
            $form['submit'] = true;
        }else {
            $form['submit'] = false;
        }
        $answer = array();
        /* 该遍历是为了转换数组为字符串 */
        foreach($form as $key => $value){
            /* 只有当键是数值才进行处理数据 */
            if( is_numeric($key) ){
                /* 如果 $value 的类型是数组, 那么就进行数据转化 */
                if( is_array($value) ){
                    // 先对数组进行排序
                    sort($value);
                    // 然后将其转换为字符串
                    $multi = implode("", $value);
                    // 放到表单中
                    $form[$key] = $multi;
                }
                /* 不管怎么样, 都将数据放到新的数组中 */
                $answer[$key] = $form[$key];
            }
        }
        $answer_json = json_encode($answer);
        $_POST['answer_json'] = $answer_json;
        $_POST['answer'] = $answer;
        return true;
    }

    /** issuePaper api
     * @param $form
     * @return bool
     */
    public static function issuePaperDataVerify(&$form): bool{
        foreach ($form as $key => $value){
            /* 判断键对应的值是否为空 */
            if( CommonMethods::isEmpty($form[$key]) ) {
                RespJson::fail("{$key}: 不能为空");
                return false;
            }
            /* 如果是标题的话, 那么进行字符串的转义 */
            if( $key === 'title' ){
                CommonMethods::enEscape($form[$key]);
            }
        }
        return true;
    }

    /** addQuestionBank api
     * @param $form
     * @return bool
     */
    public static function addQuestionBankDataVerify(&$form): bool{
        /* 对表单数据进行修改调整 */
        foreach ($form as $key => $value){
            /* 如果题型是判断题, 那么它的CD选项都是空的 */
            if( $form['type'] === 'judge'
                    && ($key === 'optionC'
                    || $key === 'optionD') ){
                $form[$key] = '';
                continue;
            }
            /* 判断键对应的值是否为空 */
            if( CommonMethods::isEmpty($form[$key]) ) {
                RespJson::fail("{$key}: 不能为空");
                return false;
            }
            /* 如果是多选题, 那么将答案数组数据变成字符串 */
            if( $form['type'] === 'multi' && $key === 'answer' && is_array($value) ){
                /*  */
                $temp = '';
                /* 对数组进行排序 */
                sort($value);
                foreach ($value as $item){
                    $temp .= $item;
                }
                /* 修改表单中的数据 */
                $form['answer'] = $temp;
            }
            /* 对表单数据进行转义 */
            CommonMethods::enEscape($form[$key]);
        }
        return true;
    }

    /** setPassword api
     * @param $form
     * @return bool
     */
    public static function setPasswordDataVerify(&$form): bool{
        /* 正则表达式用来筛查是否存在特殊符号 */
        foreach ($form as $value){
            if( preg_match("/((?=[\x21-\x7e]+)[^A-Za-z0-9])/", $value) ){
                RespJson::fail("密码只由数字和字母组成");
                return false;
            }
        }
        if( !self::isEmptyAndEscape($form) ) return false;
        /* 判断新旧密码是否相同 */
        if( $form['password'] === $form['newPassword'] ){
            RespJson::fail("新旧密码不能一致");
            return false;
        }
        return true;
    }

    /** appointmentExam api 表单数据校验并转移
     * @param $form
     * @return bool
     */
    public static function appointmentDataVerify(&$form): bool{
        return self::isEmptyAndEscape($form);
    }

    /** login api 表单数据, 并转义
     * @param $form
     * @return bool
     **/
    public static function loginDataVerify(&$form): bool{
        return self::isEmptyAndEscape($form);
    }

    /** 判空以及转义的操作
     * @param $form
     * @return bool
     */
    public static function isEmptyAndEscape(&$form): bool{
        foreach($form as $key => $value){
            /* 判断键对应的值是否为空 */
            if( CommonMethods::isEmpty($form[$key]) ) {
                RespJson::fail("{$key}: 不能为空");
                return false;
            }
            /* 对当前的数据进行转义, 防止sql注入(初级) */
            CommonMethods::enEscape($form[$key]);
        }
        return true;
    }

    /** 角色认证, 并返回该用户的数据信息 *
     * @param $token
     * @param $role
     * @return array
     * @throws Exception
     */
    public static function verifyRole($token, $role): array{
        /* 解析token, 获取用户数据 */
        $result = self::parseToken($token);
        if( CommonMethods::isEmpty($result) ) return $result;
        return $result['role'] === $role ? $result : array();
    }

    /** 解析token, 并返回该用户的数据信息 *
     * @param $token
     * @return array
     * @throws Exception
     */
    public static function parseToken($token): array{
        /* 校验token */
        if( !self::verifyToken($token) ) return array();
        /* 数据库查询 */
        DBUtils::init();
        $sql = DBUtils::getSql("php_user")
            ->where("md5(uniqueID) = '{$token}'")
            ->select();
        $result = DBUtils::queryOne($sql);
        DBUtils::close();
        return $result;
    }

    /** 校验token, 是否合法 *
     * @param $token
     * @return bool
     */
    private static function verifyToken($token): bool{
        return !CommonMethods::isEmpty($token) &&
            CommonMethods::compareLength($token, "=", 32);
    }


}